/*global pi */

pi.mod.define('pi.math.vec2', function (pi) {
	"use strict";

	var module = {};

	// 零向量
	module.ZERO = {
		x: 0.0,
		y: 0.0
	};

	// x方向的单位向量
	module.X_UNIT = {
		x: 1.0,
		y: 0.0
	};

	// y方向的单位向量
	module.Y_UNIT = {
		x: 0.0,
		y: 1.0
	};

	// 分量全为1的向量
	module.ONE = {
		x: 1.0,
		y: 1.0
	};

	// 创建
	module.create = function (xVal, yVal) {
		return {
			x: xVal || 0,
			y: yVal || 0
		};
	};

	// 设置
	module.set = function (dst, xVal, yVal) {
		dst.x = xVal || 0;
		dst.y = yVal || 0;
	};

	// 拷贝
	module.copy = function (dst, v) {
		dst.x = v ? v.x : 0.0;
		dst.y = v ? v.y : 0.0;
	};

	// 是否相等
	module.isEqual = function (v1, v2) {
		return Math.abs(v1.x - v2.x) < Number.MIN_VALUE && Math.abs(v1.y - v2.y) < Number.MIN_VALUE;
	};

	// 逆向量：大小相等，方向相反
	module.negative = function (dst, src) {
		dst.x = -src.x;
		dst.y = -src.y;
	};

	// 加法
	module.add = function (dst, v1, v2) {
		dst.x = v1.x + v2.x;
		dst.y = v1.y + v2.y;
	};

	// 减法
	module.sub = function (dst, v1, v2) {
		dst.x = v1.x - v2.x;
		dst.y = v1.y - v2.y;
	};

	// 分量乘法
	module.mul = function (dst, v1, v2) {
		dst.x = v1.x * v2.x;
		dst.y = v1.y * v2.y;
	};

	// 分量除法
	module.div = function (dst, v1, v2) {
		dst.x = v1.x / v2.x;
		dst.y = v1.y / v2.y;
	};

	// 数乘: 向量的缩放
	module.scale = function (dst, src, num) {
		dst.x = num * src.x;
		dst.y = num * src.y;
	};

	// 点乘
	module.dot = function (v1, v2) {
		return v1.x * v2.x + v1.y * v2.y;
	};

	// 叉乘：
	// v1, v2符合右手定则，返回正数
	// v2, v1符合右手定则，返回负数
	// v1, v2同向，返回0
	// 绝对值的含义是：v1、v2组成的平行四边形的面积
	module.cross = function (v1, v2) {
		return v1.x * v2.y - v1.y * v2.x;
	};

	// 长度的平方
	module.lengthSq = function (v) {
		return v.x * v.x + v.y * v.y;
	};

	// 长度
	module.length = function (v) {
		return Math.sqrt(v.x * v.x + v.y * v.y);
	};

	// 距离的平方
	module.distanceSq = function (p1, p2) {
		var x = p1.x - p2.x,
			y = p1.y - p2.y;
		return x * x + y * y;
	};

	// 距离
	module.distance = function (p1, p2) {
		var x = p1.x - p2.x,
			y = p1.y - p2.y;
		return Math.sqrt(x * x + y * y);
	};

	// 单位化: 0向量返回0向量；否则返回同向的长度为1的向量
	module.normalize = function (dst, src) {
		var len;
		if (module.isEqual(src, module.ZERO)) {
			dst.x = dst.y = 0.0;
		} else {
			len = module.length(src);
			dst.x = src.x / len;
			dst.y = src.y / len;
		}
	};

	// src逆时针旋转90度后的向量
	module.perp = function (dst, src) {
		dst.x = -src.y;
		dst.y = src.x;
	};

	// v在单位向量axis上的投影长度（有符号）
	module.projLen = function (v, axis) {
		return module.dot(v, axis);
	};

	// 线性插值
	module.lerp = function (dst, v1, v2, frac) {
		dst.x = v1.x + frac * (v2.x - v1.x);
		dst.y = v1.y + frac * (v2.y - v1.y);
	};

	// 夹角：单位为弧度
	module.angle = function (v1, v2) {
		var rad = 0,
			vZero = module.ZERO;
		if (!module.isEqual(v1, vZero) && !module.isEqual(v2, vZero)) {
			rad = module.lengthSq(v1) * module.lengthSq(v2);
			rad = Math.sqrt(rad);
			rad = module.dot(v1, v2) / rad;

			if (rad > 1.0) {
				rad = 1.0;
			} else if (rad < -1.0) {
				rad = -1.0;
			}
			rad = Math.acos(rad);
		}
		return rad;
	};

	return module;
});